LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

计算机图形学⑦

2021/4/20

7.Shading 1(Shading,pipeline,texture mapping)(着色,管线,纹理映射)

7.Shading 1(Shading,pipeline,texture mapping)(着色,管线,纹理映射)

specular highlight in blinn-phong model(布林冯中的高光)

image-20210420145528393

image-20210420145344393

高光相:由于镜面反射光的方向和观测方向接近

半程向量h=取l和v的角平分线,再做归一化

此处h和n(半程向量和法线)接近相当于v和r(观测方向和反射光)接近

真实情况依然要考虑表面的吸收率,我们在此处省略

用h和n的情况比较多,因为更好计算(其实我也不知道为什么更好算)


为什么要有指数p?

image-20210420151229887

因为单单一个余弦图像的容忍度很大,用它生成的高光也很大

在Blinn-Phong model中p一般采用100到200

展示出来就是这样哒

image-20210420151646275

ks表示了其亮度,p越大高光越小

ambient lighting in Blinn-Phong model(布林冯中的环境光)

image-20210420151923545

环境光不讲究光从哪进来,同时从哪看也没有关系,和法线也没有关系

所以近似认为环境光是一个常数(以上都是大胆的假设,因为深究特别难)


image-20210420152129644

总结一下Blinn-Phong model就是这样啦

布林冯是经验模型,并不基于真实物理光照哦

Shading Frequencies(着色频率)

image-20210420153547995

统一模型着色频率不相同会导致什么?

image-20210420154241558

逐三角形着色:三角形表面就是一个平面,把三角形的法线求出(对边做一个叉积)

这种也叫Flat Shading

image-20210420154535326

逐顶点着色:每个顶点做一次着色(先不管顶点的法线怎么求),三个顶点组成三角形,其内部的颜色用插值获取

这种也叫Gouraud Shading

image-20210420154834246

逐像素着色:对前文提到的三角形内的每个像素都插值出独特的法线方向,对每个像素进行一次着色,得到相对比较好的结果

这种也叫Phong Shading(这和前面那个布林冯不一样!虽然都是冯发明的,但这个是着色频率)

image-20210420155241044

哪一种更好呢?并无绝对

几何足够复杂时,使用相对简单的着色模型也能得到不错的结果

(不是很能理解的话具体看图,每一行都是同一种几何形体使用不同的着色模型,我们发现第三种几何形体已经很复杂了,但使用三种方法都相差无几,但使用冯着色模型会造成更大开销)


历史遗留问题:我如何获得逐顶点和逐像素的法线


逐顶点如下:

image-20210420160030815

求一个顶点的法线,取和他关联的平面的法线的平均值(好办法)


逐像素如下:

image-20210420160210027

求得顶点的法线后,用重心坐标求出其中的法线过渡(记得归一化哦)

Graphics(Real-time Rendering)Pipeline(图形管线/实时渲染管线)

给我着色模型!给我三维模型!给我光照条件!就能得到渲染结果!

image-20210420160938356

管线:从一个真实场景到演示一份图像,中间发生了什么?

  1. 输入空间中的点
  2. 将三维空间中的点投影到屏幕上
  3. 这些点形成三角形
  4. 光栅化(将三角形画在屏幕上)
  5. 三角形离散成各个像素
  6. 对每个像素进行着色
  7. 输出图像

现代GPU允许我们自己编程控制像素和顶点如何进行着色,这个过程我们称为shader

shader是每个顶点或每个像素通用的执行方法,只需要管每个顶点每个像素如何运作,而不是写循环。

如果我们写的是顶点的操作,则这个shader被称为vertex shader(顶点着色器)

如果我们写的是像素的操作,则这个shader被称为fragment/pixel shader(片段/像素着色器)

image-20210420162858944

此处使用的GLSL是OpenGL的着色语言,图片中是像素着色器的一个小程序

接下来闫老师讲了一堆巴拉巴拉的不好总结

硬要总结一下的话就是“非常简单”(圈起来要考的)

讲了一堆硬件相关所以这里就先略过了

texture mapping(纹理映射)

引入纹理映射的基本思路:希望在物体不同位置定义不同的属性(漫反射系数或其他)

image-20210420170509136

先做一个声明:任何三维物体的表面都是二维的

所以texture(纹理)是什么:texture就是一张(image)图

将这张图蒙在物体上(图上的点和物体上的点一一对应),这个过程就叫纹理映射

image-20210420170830752

(闫老师能不能用点阳间的图,san值狂掉)

怎么把空间中的三角形映射到平面上?

  1. 需要艺术家(美工)做出一个模型,然后展开贴在物体上,对美工来说这是一个繁重的过程
  2. 给一个模型,我们将其展开为一个平面,希望三角形尽量少扭曲,这个过程很难,会是以后重要的研究方向(参数化)

我们在纹理上定义一个坐标系(u,v)(uv的范围都在0到1)

这样就可以把任意物体的三角形映射到纹理上显示出来

接下来我们想知道:

如果知道三角形对应顶点的uv,那么如何知道三角形内部对应每个点的uv

下节课会着重介绍插值(通过三角形的三个顶点属性,在三角形内部做一个平滑的过渡)


本文于4.20 17:25完成,终于明白什么是管线啦!(豁然开朗好开心)